package com.example.myapplication.uitls

import android.util.Log
import com.example.myapplication.`interface`.PrintDriver
import com.example.myapplication.bean.*
import com.gprinter.aidl.GpService
import com.gprinter.command.LabelCommand
import cpcl.PrinterHelper
import java.util.*

class HYHMA300LDriver(var gpService: GpService) : PrintDriver {
    lateinit var tsc: LabelCommand

    override fun Open() {
    }

    override fun PrinterStatus() {
    }

    override fun Close() {
    }

    override fun Print(data: HashMap<String, String>, template: PrintTemplate) {
        Log.e("sss", data.toString())
//        Log.e("sss1", Gson().toJson(template))
        /** 汉印设置标签高度
         * "0" 上下文对象
         * "200" 打印机水平方向dpi（根据实际打印机dpi设置）
         * "200" 打印机垂直方向dpi（根据实际打印机dpi设置）
         * "370" 标签高度 （单位：dot）200dpi 8 dot = 1mm，300dpi 12 dot = 1mm
         * "1" 打印次数
         */
        PrinterHelper.printAreaSize("0", "200", "200", template.page.height.toString(), "1")

        for (element in template.elements) {
            Log.e("sss2", element.toString())
            when (element) {
                is BoxElement -> renderBox(element, data)
                is LineElement -> renderLine(element, data)
                is TextElement -> renderText(element, data)
                is BarCodeElement -> renderBarCode(element, data)
            }
        }

        /**
         * 汉印打印
         */
        PrinterHelper.Form()//打印标签定位作用（连续纸不可用）
        PrinterHelper.Print()//打印
    }

    private fun renderBox(element: BoxElement, data: HashMap<String, String>) {
        /** 汉印打印Box
         * {x0} 左上角的 X 坐标
         * {y0} 左上角的 Y 坐标
         * {x1} 右下角的 X 坐标
         * {y1} 右下角的 Y 坐标
         * {width} 形成矩形框的线条的单位宽度
         */
        PrinterHelper.Box(
            element.x.toString(),
            element.y.toString(),
            (element.x + element.width).toString(),
            (element.y + element.height).toString(),
            element.borderSize.toString()
        )

    }

    private fun renderLine(element: LineElement, data: HashMap<String, String>) {
        /** 汉印打印线条
         * {x0} 起始点的 X 坐标
         * {y0} 起始点的 Y 坐标
         * {x1} 终止点的 X 坐标
         * {y1} 终止点的 Y 坐标
         * {width} 线条的单位宽度
         */
        PrinterHelper.Line(
            element.x.toString(),
            element.y.toString(),
            element.width.toString(),
            element.height.toString(),
            element.borderSize.toString()
        )
    }

    private fun renderText(element: TextElement, data: HashMap<String, String>) {
        var text = data["text"]
        var font = element.printerSpec["佳博-380A"]

        if (element.hAlign == "LEFT") {

        } else if (element.hAlign == "CENTER") {
            /**
             * 40是一个文字的宽度
             */
            element.x = element.width / 2 - text!!.length * 40 / 2
        } else if (element.hAlign == "RIGHT") {

        }
        /** 汉印设置字体放大
         * {w} 宽度放大倍数，有效放大倍数为1 到16
         * {h} 高度放大倍数，有效放大倍数为1 到16
         */
        PrinterHelper.SetMag(element.mag.toString(), element.mag.toString())
        /** 汉印打印文字
         *  s1 TEXT,TEXT_Anti_White,TEXT90,TEXT180,TEXT270
         * {font} 字体名称/编号"8"= 英文字体12*24 中文字体24*24 简体中文 GB18030 "4"=16*32 32*32 简体中文 GBK
         * {size} 忽略该参数，请输入任意数字
         * {x} 横向起始位置
         * {y} 纵向起始位置
         * {str} 要打印的文本
         */
        PrinterHelper.Text(
            PrinterHelper.TEXT,
            "8",
            "0",
            element.x.toString(),
            element.y.toString(),
            text
        )
    }

    private fun renderBarCode(element: BarCodeElement, data: HashMap<String, String>) {
        var printorder = data["barcode"]
        /** 汉印打印条形码
         * BARCODE 横向打印条码 VBARCODE 纵向打印条码
         * 条码种类code128 理想宽窄比N/A 理想窄点宽度2
         * "1"= 宽窄比2.0:1 "2"=2.5:1
         * {2} 窄条的单位宽度
         * {40} 宽条与窄条的比率
         * {height} 条码的单位高度
         * {118} 横向起始位置
         * {245} 纵向起始位置
         * 第8个参数=false 后三位参数可以忽略
         * {printorder} 条码数据
         */
        PrinterHelper.Barcode(
            PrinterHelper.BARCODE,
            PrinterHelper.code128,
            "2",
            "1",
            element.hight.toString(),
            element.x.toString(),
            element.y.toString(),
            false,
            "7",
            "20",
            "5",
            printorder
        )
    }
}